package Day18_网络编程.demo5_优化上传;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Author：pengzhilin
 * @Date: 2020/5/10 14:15
 */
public class Server {  // 单线程
    // 通过日历对象和File对象:  年  月   日  时  分  秒  毫秒
    public static void main(String[] args) throws Exception {
        // 1.创建ServerSocket对象,指定端口号
        ServerSocket ss = new ServerSocket(7777);

        while (true) {
            // 2.调用accept()方法,等待客户端连接,连接成功返回Socket对象,连接失败就一直阻塞
            Socket socket = ss.accept();

            // 开辟一条线程上传文件
            new Thread(()->{
                // 文件上传的任务代码
                try {
                    // 3.通过返回的Socket对象获得字节输入流对象,关联连接通道
                    InputStream is = socket.getInputStream();

                    // 4.创建字节输出流对象,关联目的地文件路径
                    FileOutputStream fos = new FileOutputStream("Demo02\\aa\\"+System.currentTimeMillis()+".jpg");

                    // 5.定义一个字节数组,用来存储读取到的文件字节数据
                    byte[] bys = new byte[8192];
                    // 6.定义一个变量,用来存储读取到的字节个数
                    int len;
                    // 8.循环读取
                    // 问题: 服务器还在等待读取客户端写过来的数据
                    while ((len = is.read(bys)) != -1) {
                        // 9.在循环中,写出数据
                        fos.write(bys,0,len);
                    }
                    // --------------服务器读完了客户端写过来的数据之后,回写信息给客户端-----------------
                    System.out.println("服务器开始回写数据................");
                    // 10.通过返回的Socket对象获得字节输出流对象,关联连接通道
                    OutputStream os = socket.getOutputStream();

                    // 11.使用字节输出流对象,写出字符串数据
                    os.write("文件上传成功!".getBytes());// 写字符串数据的字节数组

                    // 12.关闭资源
                    fos.close();
                    socket.close();
                    //ss.close();// 服务器不关闭
                } catch (IOException e) {

                }
            }).start();
        }
    }
}
